package com.fansl.koala.quickdev.module.users.controller;


import cn.hutool.core.bean.BeanUtil;
import com.fansl.koala.quickdev.common.bean.PageBean;
import com.fansl.koala.quickdev.common.bean.R;
import com.fansl.koala.quickdev.module.users.bean.dto.CustomUserPermissionDTO;
import com.fansl.koala.quickdev.module.users.bean.dto.SysMenuDTO;
import com.fansl.koala.quickdev.module.users.entity.SysMenu;
import com.fansl.koala.quickdev.module.users.service.ISysMenuService;
import com.fansl.koala.quickdev.module.users.vo.SimpleTreeVo;
import com.fansl.koala.quickdev.module.users.vo.MenuTreeVo;
import com.fansl.koala.quickdev.module.users.vo.SysMenuVo;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.Set;

/**
 * <p>
 * 菜单权限表 前端控制器
 * </p>
 *
 * @author fansl
 * @since 2020-03-30
 */
@RestController
@AllArgsConstructor
@RequestMapping("/users/sys-menu")
public class SysMenuController {
    private final ISysMenuService sysMenuService;

    /**
     * 添加
     *
     * @param sysMenuDTO 参数
     * @return true/false
     */
    @PostMapping("")
    public Mono<R<Boolean>> add(@RequestBody SysMenuDTO sysMenuDTO) {
        SysMenu sysMenu = sysMenuDTO2Bean(sysMenuDTO);
        boolean b = sysMenuService.save(sysMenu);
        return Mono.just(R.ok(b));
    }

    /**
     * 根据主键更新
     *
     * @param sysMenuDTO 参数
     * @return true/false
     */
    @PutMapping("")
    public Mono<R<Boolean>> updateById(@RequestBody SysMenuDTO sysMenuDTO) {
        SysMenu sysMenu = sysMenuDTO2Bean(sysMenuDTO);
        boolean b = sysMenuService.updateById(sysMenu);
        return Mono.just(R.ok(b));
    }

    /**
     * 根据主键获取信息
     *
     * @param id 主键
     * @return 查询数据
     */
    @GetMapping("/{id}")
    public Mono<R<SysMenuVo>> getById(@PathVariable Long id) {
        SysMenu sysMenu = sysMenuService.getById(id);
        SysMenuVo sysMenuVo = sysMenu2Vo(sysMenu);
        return Mono.just(R.ok(sysMenuVo));
    }

    /**
     * 根据主键删除
     *
     * @param id 主键
     * @return true/false
     */
    @DeleteMapping("/{id}")
    public Mono<R<Boolean>> delById(@PathVariable Long id) {
        boolean b = sysMenuService.removeById(id);
        return Mono.just(R.ok(b));
    }

    /**
     * 分页查询
     *
     * @param page    分页询参数
     * @param sysMenu 查询参数
     * @return 查询数据
     */
    @GetMapping("/page")
    public Mono<R<PageBean<MenuTreeVo>>> pageTree(PageBean<MenuTreeVo> page, SysMenu sysMenu) {
        //查询
        PageBean<MenuTreeVo> result = sysMenuService.pageTree(page, sysMenu);
        return Mono.just(R.ok(result));
    }

    /**
     * @return
     */
    @GetMapping("/tree-list")
    public Mono<R<List<SimpleTreeVo>>> listTree() {
        List<SimpleTreeVo> treeVoList = sysMenuService.listTree();
        return Mono.just(R.ok(treeVoList));
    }

    /**
     * 获取权限列表
     *
     * @return
     */
    @GetMapping("/permission/list")
    public Mono<R<List<SimpleTreeVo>>> listPermissions() {
        List<SimpleTreeVo> treeVoList = sysMenuService.listPermissions();
        return Mono.just(R.ok(treeVoList));
    }

    /**
     * 获取用户自定义菜单ID
     *
     * @param userId 用户id
     * @param type   权限类型（1-加权限2-减权限）
     * @return 菜单ID
     */
    @GetMapping("/user/permission/{userId}/{type}")
    public Mono<R<List<String>>> getUserPermissions(@PathVariable Long userId, @PathVariable String type) {
        List<String> permissions = sysMenuService.getUserMenuByType(userId, type);
        return Mono.just(R.ok(permissions));
    }

    /**
     * 自定义用户自定义权限
     *
     * @param userId 用户id
     * @param param  自定义权限集合
     * @return TRUE/FALSE
     */
    @PutMapping("/user/permission/{userId}")
    public Mono<R<Boolean>> customUserPermission(@PathVariable Long userId, @RequestBody CustomUserPermissionDTO param) {
        boolean result = sysMenuService.customUserPermission(userId, param);
        return Mono.just(R.ok(result));
    }

    /**
     * 获取角色自定义菜单ID
     *
     * @param roleId 角色id
     * @return 菜单ID
     */
    @GetMapping("/role/permission/{roleId}")
    public Mono<R<List<String>>> getRolePermissions(@PathVariable Integer roleId) {
        List<String> result = sysMenuService.getRoleMenuByRoleId(roleId);
        return Mono.just(R.ok(result));
    }

    /**
     * 分配角色权限
     *
     * @param roleId 角色id
     * @param param  自定义权限集合
     * @return TRUE/FALSE
     */
    @PutMapping("/role/permission/{roleId}")
    public Mono<R<Boolean>> customRolePermission(@PathVariable Integer roleId, @RequestBody Set<Integer> param) {
        boolean result = sysMenuService.customRolePermission(roleId, param);
        return Mono.just(R.ok(result));
    }

    /**
     * Vo对象转换
     *
     * @param sysMenu 源对象
     * @return 目标对象
     */
    private SysMenuVo sysMenu2Vo(SysMenu sysMenu) {
        SysMenuVo target = new SysMenuVo();
        BeanUtil.copyProperties(sysMenu, target);
        return target;
    }

    /**
     * DTO对象转换
     *
     * @param sysMenuDTO 源对象
     * @return 目标对象
     */
    private SysMenu sysMenuDTO2Bean(SysMenuDTO sysMenuDTO) {
        SysMenu target = new SysMenu();
        BeanUtil.copyProperties(sysMenuDTO, target);
        target.setType(sysMenuDTO.getType().getCode());
        return target;
    }
}
